Pangolin笔记
最近有个大作业,需要写个界面,显示用C++的Opencv实现的一些效果
久有耳闻Pangolin,打算用它试试实现,顺便入个门
但是最终因为他的控件只有竖直方向排版(也可能是我了解不深),而且我也没有解决中文乱码的问题
没法满足需求,最终还是打算用QT做,记录一下学习过程
使用Pangolin的感觉就是资料太少了,只有一些零零碎碎的demo
Pangolin的笔记以注释的形式写在代码里(有些不用使用的代码注释掉了作为备忘)
main.cpp
#include <pangolin/pangolin.h>
#include <opencv2/opencv.hpp>
#define pix(x) (pangolin::Attach::Pix(x)) //方便以像素定义画面尺寸
//窗口大小
const short WINDOWS_WIDTH = 640;
const short WINDOWS_HEIGTH = 480;
//上侧选择栏大小
const short TOP_SELECTION_WIDTH = WINDOWS_WIDTH;
const short TOP_SELECTION_HEIGHT = 35;
//左侧选择栏大小
const short LEFT_SELECTION_WIDTH = 128;
const short LEFT_SELECTION_HEIGHT = WINDOWS_HEIGTH - TOP_SELECTION_HEIGHT;
//显示图像大小
const short IMAGE_WIDTH = WINDOWS_WIDTH - LEFT_SELECTION_WIDTH;
const short IMAGE_HEIGHT = WINDOWS_HEIGTH - TOP_SELECTION_HEIGHT;
void function()
{
std::cout << "In the function" << std::endl;
}
int main()
{
//创建窗口 窗口名 宽 高
pangolin::CreateWindowAndBind("Main",WINDOWS_WIDTH,WINDOWS_HEIGTH);
//设置字体样式
// pangolin::GlFont * font = new pangolin::GlFont("../font/simhei.ttf", 60.0);
//打开颜色混合 以及颜色混合方式 省略则字体无法正常显示
// glEnable(GL_BLEND);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//开启深度测试 窗口中只会绘制面朝相机的那一面像素 绘制3D就要打开
// glEnable(GL_DEPTH_TEST);
//设置相机
// ProjectionMatrix指定内参 (高 宽 fx fy cx cy 最近视距 最远视距)
// ModelViewLookAt指定外参 相机所在x,y,z 视点x,y,z 相机轴
// pangolin::OpenGlRenderState camera(
// pangolin::ProjectionMatrix(640,480,420,420,320,320,0.2,100),
// pangolin::ModelViewLookAt(2,0,2, 0,0,0, pangolin::AxisY));
//设置视图
// .SetBounds 设置位置大小属性 分别对应(bottom, top, left, right)的比例 也可以用pangolin::Attach::Pix(x)指定像素
// pangolin::View& camera_view = pangolin::CreateDisplay()
// .SetBounds(0.0, 1.0, 0.0, 1.0, 640.0f/480.0f)
// .SetHandler(new pangolin::Handler3D(camera));
// 左侧选择栏
pangolin::CreatePanel("left_selection").SetBounds(0, pix(LEFT_SELECTION_HEIGHT), 0, pix(LEFT_SELECTION_WIDTH));
pangolin::Var<bool> left_button1("left_selection.Button", false, false);// name 默认值 (toggle为true为选框 为false为按钮)
pangolin::Var<std::function<void(void)>> left_button2("left_selection.function", function);//按钮回调函数
// 顶部选择栏
pangolin::CreatePanel("top_selection").SetBounds(pix(WINDOWS_HEIGTH-TOP_SELECTION_HEIGHT), pix(WINDOWS_HEIGTH), 0, pix(WINDOWS_WIDTH));
pangolin::Var<bool> top_button1("top_selection.Button", false, false);// name 默认值 (toggle为true为选框 为false为按钮)
// 图片
pangolin::View& image_view = pangolin::Display("rgb").SetBounds(0, pix(IMAGE_HEIGHT), pix(WINDOWS_WIDTH - IMAGE_WIDTH), pix(LEFT_SELECTION_WIDTH+IMAGE_WIDTH));// 建立图片视图
pangolin::GlTexture imageTexture(IMAGE_WIDTH,IMAGE_HEIGHT); // 图片容器 width height
cv::Mat image = cv::imread("../test.jpg"); //读取图像
cv::resize(image,image,cv::Size(IMAGE_WIDTH,IMAGE_HEIGHT));
imageTexture.Upload(image.data,GL_BGR,GL_UNSIGNED_BYTE);//将图片放入容器 BGR格式 无符号
while(!pangolin::ShouldQuit()) //如果没退出界面
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色和深度缓存
//显示相机
// camera_view.Activate(camera);
if (pangolin::Pushed(left_button1))
{
std::cout << "In Button" << std::endl;
}
//显示图片
// image_view.Activate();
// imageTexture.RenderToViewportFlipY(); // 要翻转y不然图像为上下颠倒 原型为RenderToViewport();
//显示字体
// glColor3f(0.0,0.0,1.0); //RGB 蓝色
// std::string tt = "1234";
// font->Text(tt.c_str()).Draw(200, 200, 0);
pangolin::FinishFrame(); //显示
}
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(learning_pangolin)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE "Debug")
# 使用opencv
find_package( OpenCV REQUIRED )
find_package( Pangolin REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME}
main.cpp
)
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${Pangolin_LIBRARIES}
)
结果如下:
Pangolin中的按钮是绑定在一个控制板panel上的
我的想法是上侧选择栏的按钮横向排列作为界面切换
但是好像Pangolin没有提供,默认按钮绑定panel后就是竖直排列(也就是和panel基本等宽)
如果实在要在上边横向排列按钮的话,应该可以一个按钮一个panel横向排列过去
总结起来就是,我感觉Pangolin适合做一些简单的交互式的3D的可视化
比较适合与类似SLAM可视化等,左边是简单按钮控制一些逻辑,右边是显示3D位姿之类的画面